home *** CD-ROM | disk | FTP | other *** search
/ Die Speccy' 97 / Die Speccy' 97.iso / amiga_system / the_aminet / comm / bbs / bbbbs85.lha / rexx / bbsFile.rexx < prev    next >
OS/2 REXX Batch file  |  1995-06-03  |  41KB  |  1,656 lines

  1. /* $VER: bbsFile.rexx 8.5 (3.6.95)
  2. Copyright ⌐ 1994-95 Richard Lee Stockton
  3. BBBBS local file manager
  4. FREELY DISTRIBUTABLE
  5. */
  6.  
  7. SIGNAL ON BREAK_C
  8. SIGNAL ON BREAK_E
  9.  
  10. IF ~SHOW('P','QuickSortPort') THEN CALL setup.rexx()
  11. IF ~SHOW('P','QuickSortPort') THEN EXIT 666
  12.  
  13. IF GETCLIP('BBS_UPLOAD')~='' THEN
  14.   DO
  15.     SAY 'Uploading is temporarily suspended while the filelists are rebuilding.'
  16.     EXIT
  17.   END
  18.  
  19. ARG name pw
  20.  
  21. CALL OPENPORT('BBSFILE')
  22. CALL PRAGMA('P',-1)
  23. title.=''
  24. title.1='BBBBS File Manager'
  25. title.2='Version 8.5'
  26. title.3='3-Jun-95'
  27. def=''
  28. pen3=''
  29. lineup='1B'x'M'
  30. files.=''
  31. files.0=0
  32. dlist=''
  33. numlist=''
  34. newlist.=''
  35. newlist.0=0
  36. savefileflag=0
  37. linesperpage=20
  38. namemask=COMPRESS(XRANGE(),XRANGE('A','Z')' _-')
  39.  
  40. topath='RAM:'
  41. figarg='s:CONFIG.BBS'
  42. IF ~EXISTS(figarg) THEN figarg='BBS:BBS_TEXT/CONFIG.BBS'
  43. x=OPEN(f,figarg,'R')
  44. IF x=0 THEN
  45.   DO
  46.     SAY 's:CONFIG.BBS and BBS:BBS/CONFIG.BBS are both missing!'
  47.     EXIT
  48.   END
  49. lynes.=''
  50. DO i=1 TO 40
  51.   lynes.i=READLN(f)
  52. END
  53. CALL CLOSE(f)
  54.  
  55. compos=POS('/*',lynes.1)
  56. IF compos>0 THEN lynes.1=LEFT(lynes.1,compos-1)
  57. bbsname=STRIP(lynes.1)
  58. sysop=WORD(lynes.2,1)
  59. compos=POS('/*',lynes.3)
  60. IF compos>0 THEN lynes.3=LEFT(lynes.3,compos-1)
  61. bbsdevice=word(lynes.4,1)
  62. sysoplevel=WORD(lynes.5,1)
  63. bbspath=WORD(lynes.6,1)
  64. IF ~EXISTS(bbspath) THEN
  65.   DO
  66.     SAY bbspath 'does not exist!'
  67.     EXIT
  68.   END
  69. testchar=RIGHT(bbspath,1)
  70. IF testchar~='/' & testchar~=':' THEN bbspath=bbspath'/'
  71. libpath=WORD(lynes.8,1)
  72. IF ~EXISTS(libpath) THEN
  73.   DO
  74.     SAY libpath 'does not exist!'
  75.     EXIT
  76.   END
  77. testchar=RIGHT(libpath,1)
  78. IF testchar~='/' & testchar~=':' THEN libpath=libpath'/'
  79. IF WORD(lynes.25,1)=1 THEN scratch=bbspath'Scratch'
  80. ELSE scratch='RAM:Scratch'
  81. CALL MAKEDIR(scratch)
  82. extension=WORD(lynes.32,1)
  83. compos=POS('/*',lynes.33)
  84. IF compos>0 THEN lynes.33=LEFT(lynes.33,compos-1)
  85. arccom=STRIP(lynes.33)
  86. IF LEFT(extension,1)~='.' THEN
  87.   DO
  88.     extension='.lzh'
  89.     arccom='lharc -m m'
  90.   END
  91.  
  92. IF name='' THEN
  93.   DO
  94.     OPTIONS PROMPT ' Are you 'sysop'? (Yn) > '
  95.     PULL answer
  96.     IF answer='N' THEN
  97.       DO
  98.         SAY
  99.         OPTIONS PROMPT ' Please enter your name > '
  100.         PULL name
  101.         name=cleanstring('1:'name)
  102.         IF name='' THEN EXIT 
  103.       END
  104.     ELSE name=sysop
  105.   END
  106. IF ~EXISTS(bbspath'Users/'name) THEN
  107.   DO
  108.     SAY name 'does not exist!'
  109.     EXIT
  110.   END
  111.  
  112. CALL loaddata()
  113. IF pw~=password THEN
  114.   DO
  115.     passprompt=pen3' Please Enter Password: '
  116.     DO tries=1 TO 3
  117.       OPTIONS PROMPT passprompt
  118.       PULL newpassword
  119.       SAY def
  120.       IF(password=newpassword) THEN LEAVE tries; /* correct password */
  121.       IF tries=3 THEN
  122.         DO
  123.           SAY 
  124.           SAY 'Access terminated.'
  125.           SAY '*** Bad password ***' newpassword '***'
  126.           EXIT
  127.         END
  128.       passprompt='Incorrect.  Password: ' /* ask again */
  129.     END
  130.     SAY
  131.     SAY' OK, 'name' here we go....'
  132.     SAY
  133.   END
  134.  
  135. dirs.=''
  136. IF readopen(bbspath'Lists/Libraries') THEN
  137.   DO
  138.     SAY 'Loading library list...'
  139.     DO i=1
  140.       line=READLN(f)
  141.       IF line='END' | EOF(f) THEN LEAVE i
  142.       num=WORD(line,1)
  143.       IF DATATYPE(num,'W') THEN
  144.         DO
  145.           IF num>level THEN ITERATE i
  146.           dirs.num=STRIP(WORD(line,2))
  147.         END
  148.     END
  149.     CALL CLOSE(f)
  150.     CALL sortlibraries()
  151.   END
  152. SAY
  153.  
  154. uloadflag=0
  155. DO loop=1
  156.   SAY
  157.   DO i=1 TO 3
  158.     SAY CENTER(title.i,34)
  159.   END
  160.   SAY
  161.   SAY '        1. Add Files'
  162.   SAY '        2. Add FileNote (file already exists)'
  163.   SAY '        3. Browse'
  164.   t='        Q. Quit'
  165.   IF savefileflag | newlist.0>0 THEN t=t 'and Save Changes.'
  166.   SAY t
  167.   SAY
  168.   OPTIONS PROMPT 'Select: '
  169.   PULL temp
  170.   IF temp='Q' THEN LEAVE loop
  171.   ELSE IF temp=1 THEN
  172.     DO subloop=1
  173.       IF uload()>1 THEN LEAVE subloop
  174.     END
  175.   ELSE IF temp=2 THEN
  176.     DO
  177.       IF chdir()=0 THEN
  178.         DO
  179.           rfiles=SHOWDIR(libpath||dirs.dirnum)
  180.           rnotes=SHOWDIR(bbspath'FileNotes/'dirs.dirnum)
  181.           IF WORDS(rfiles)~=WORDS(rnotes) THEN
  182.             DO
  183.               DO j=1 TO WORDS(rfiles)
  184.                 IF FIND(UPPER(rnotes),UPPER(WORD(rfiles,j)))=0 THEN
  185.                   DO
  186.                     arg=WORD(rfiles,j)
  187.                     CALL DELETE(libpath||dirs.dirnum'/.'STRIP(LEFT(dirs.dirnum,15)))
  188.                     IF testfile()=0 THEN CALL editnote()
  189.                   END
  190.               END
  191.             END
  192.         END
  193.     END
  194.   ELSE IF temp=3 THEN CALL browse()
  195.   IF dlist~='' THEN
  196.     DO
  197.       ab=0
  198.       cpy=1
  199.       SAY
  200.       IF WORD(STATEF(todir),1)='DIR' THEN
  201.         IF getinput(1 1 'Copy filelist to' todir '? (nY) > ')='N' THEN ab=1
  202.       ELSE ab=1
  203.       IF ab THEN
  204.         IF ~pickdir() THEN cpy=0
  205.       IF cpy THEN
  206.         DO i=1 TO WORDS(dlist) WHILE cpy
  207.           CALL copyfile(WORD(dlist,i))
  208.         END
  209.       ELSE IF getinput(1 1 'Clear copylist? (nY) > ')~='N' THEN dlist=''
  210.     END
  211. END
  212.  
  213. IF savefileflag | newlist.0>0 THEN
  214.   DO
  215.     CALL fileupdate()
  216.     IF SHOW('P','BBBBS') THEN CALL SETCLIP('BBS_localfiles',2)
  217.     ELSE CALL SETCLIP('BBS_localfiles')
  218.     IF SHOW('P','BBBBS_LOCAL') THEN CALL SETCLIP('BBS_mainfiles',2)
  219.     ELSE CALL SETCLIP('BBS_mainfiles')
  220.   END
  221.  
  222. EXIT
  223.  
  224.  
  225. /* SUBROUTINES */
  226.  
  227. sortlibraries:
  228. SAY 'Sorting Libraries...'
  229. count=0
  230. sdirs.=''
  231. DO i=1 TO level
  232.   IF dirs.i='' THEN ITERATE i
  233.   count=count+1
  234.   sdirs.count=dirs.i i
  235. END
  236. sdirs.0=count
  237. IF count>0 THEN CALL QSort(1,count,sdirs)
  238. count=0
  239. libs.=''
  240. DO i=1 TO sdirs.0
  241.   tempnum=WORD(sdirs.i,2)
  242.   tempdir=WORD(sdirs.i,1)
  243.   IF FIND(data.21,UPPER(tempdir))=0 THEN
  244.     DO
  245.       string=' '
  246.       IF tempnum<10 THEN string=string' '
  247.       string=string || tempnum'. 'LEFT(tempdir,14)
  248.       count=count+1
  249.       libs.count=string
  250.     END
  251. END
  252. libs.0=count%4
  253. IF (count//4)>0 THEN libs.0=libs.0+1
  254. DO i=1 TO libs.0
  255.   DO j=1 TO 3
  256.     k=i+j*libs.0
  257.     IF k<=count THEN libs.i=libs.i||libs.k
  258.   END
  259. END
  260. DROP sdirs.
  261. RETURN
  262.  
  263.  
  264. bbsspace:
  265. ARG tabspace .
  266. ADDRESS COMMAND 'C:info >'scratch'/filinfout' bbsdevice
  267. ok=OPEN(f,scratch'/filinfout','R')
  268. IF ok=0 THEN RETURN 20
  269. line=READLN(f)
  270. line=READLN(f)
  271. line=READLN(f)
  272. line=READLN(f)
  273. CALL CLOSE(f)
  274. IF tabspace<14 THEN SAY 
  275. bbsk=WORD(line,4)
  276. IF ~DATATYPE(bbsk,'N') THEN
  277.   DO
  278.     line=bbsdevice 'is not an info compatible device!'
  279.     SAY pen3||line||def
  280.     bbsk=0
  281.     RETURN
  282.   END
  283. bbsk=bbsk*512
  284. IF bbsk<1 THEN bbsk=0
  285. SAY RIGHT(comma(bbsk),tabspace) 'bytes available for uploads.'
  286. RETURN
  287.  
  288.  
  289. comma: PROCEDURE
  290. ARG num .
  291. dgt=LENGTH(num)
  292. numtext=''
  293. IF dgt>3 THEN numtext=','RIGHT(num,3)
  294. IF dgt>6 THEN numtext=','LEFT(RIGHT(num,6),3)||numtext
  295. IF dgt>9 THEN numtext=','LEFT(RIGHT(num,9),3)||numtext
  296. IF dgt>12 THEN
  297.   DO
  298.     numtext=','LEFT(RIGHT(num,12),3)||numtext
  299.     numtext=LEFT(num,dgt-12)||numtext
  300.   END
  301. ELSE IF dgt>9 THEN numtext=LEFT(num,dgt-9)||numtext
  302. ELSE IF dgt>6 THEN numtext=LEFT(num,dgt-6)||numtext
  303. ELSE IF dgt>3 THEN numtext=LEFT(num,dgt-3)||numtext
  304. ELSE numtext=num
  305. RETURN numtext
  306.  
  307.  
  308. is_here:
  309. ARG newname 
  310. SAY 'Checking filelist...'
  311. DO wi=1 TO 99
  312.   IF wi//3=0 THEN CALL WRITECH(STDOUT,'.')
  313.   IF dirs.wi='' THEN ITERATE wi
  314.   IF ~EXISTS(bbspath'FileNotes/'dirs.wi'/'newname) THEN ITERATE wi
  315.   line=pen3'*** File' newname 'already exists here'
  316.   IF wi<=level THEN line=line 'in the' dirs.wi 'library'
  317.   line=line'.'def
  318.   SAY line
  319.   SAY 'Original uploader should ['pen3'K'def']ill the file before uploading the replacement.'
  320.   CALL waiting()
  321.   RETURN 1
  322. END
  323. RETURN 0
  324.  
  325.  
  326. uload:
  327. CALL bbsspace(12)
  328. SAY
  329. IF bbsk<1 THEN
  330.   DO
  331.     SAY pen3'Upload area is full!'def
  332.     RETURN 2
  333.   END
  334. frompath=GETCLIP('BBS_frompath')
  335. IF frompath='' THEN frompath='RAM:'
  336. fdir=''
  337. DO loop=1
  338.   fromfile=GetFile(200,,frompath,'',' Select File to Upload ')
  339.   IF fromfile='' THEN RETURN 3
  340.   finfo=STATEF(fromfile)
  341.   IF WORD(finfo,1)='DIR' THEN RETURN 3
  342.   IF WORD(finfo,1)='FILE' THEN LEAVE loop
  343.   SAY
  344.   SAY fromfile 'does not exist!'
  345.   CALL DELAY(100)
  346. END
  347. x=LASTPOS('/',fromfile)
  348. IF x=0 THEN x=POS(':',fromfile)
  349. IF x>0 THEN
  350.   DO
  351.     arg=SUBSTR(fromfile,x+1)
  352.     fdir=LEFT(fromfile,x)
  353.     IF RIGHT(fdir,1)='/' THEN fdir=LEFT(fdir,x-1)
  354.     CALL SETCLIP('BBS_frompath',fdir)
  355.   END
  356. ELSE arg=fromfile
  357. arg=COMPRESS(arg,' :/,;|#?*()+[]"{}')  /* be sure no illegals here */
  358. x=LASTPOS('/',fromfile)
  359. IF x=0 THEN x=LASTPOS(':',fromfile)
  360. IF x>0 THEN
  361.   DO
  362.     IF DATATYPE(SUBSTR(fromfile,x+1),'W') THEN
  363.       DO
  364.         SAY 'Numbers only are not allowed as filenames!'
  365.         CALL waiting()
  366.         RETURN 1
  367.       END
  368.   END
  369. size=WORD(STATEF(fromfile),2)
  370. IF ~DATATYPE(size,'W') THEN size='654321'
  371. tempnum=LENGTH(arg)+LENGTH(size)-22
  372. DO WHILE tempnum>0
  373.   temp='          'pen3||arg def'is'pen3 tempnum||def
  374.   IF tempnum=1 THEN temp=temp 'character'
  375.   ELSE temp=temp 'characters'
  376.   temp=temp 'too long for a filename.'
  377.   SAY temp  
  378.   arg=getinput(0 0 'Filename: ')
  379.   arg=cleanstring('0:'arg)
  380.   arg=COMPRESS(arg,' :/,;|#?*')
  381.   tempnum=LENGTH(arg)+LENGTH(size)-22
  382. END
  383. IF arg='' THEN RETURN 1
  384. IF is_here(arg) THEN RETURN 1
  385. SAY
  386. SAY 'Please select an appropriate library for -' pen3||arg def'-'
  387. IF chdir()>0 THEN RETURN 1
  388. SAY 'Working...'lineup
  389. ADDRESS COMMAND 'C:COPY' fromfile PRAGMA('D')'/'arg
  390. IF testfile() THEN RETURN 1
  391. CALL DELETE(libpath||plaindir'/.'STRIP(LEFT(plaindir,15)))
  392. IF getinput(1 1 'Kill original file' fromfile '? (Ny) > ')='Y' THEN
  393.   DO
  394.     CALL DELETE(fromfile)
  395.     SAY 'Killed' fromfile'...'
  396.   END
  397. DO ui=sysoplevel+2 TO 100
  398.   IF UPPER(dirs.ui)=UPPER(plaindir) THEN RETURN 0
  399. END
  400. DO WHILE editnote() /* INSIST on a filenote */
  401. END
  402. RETURN 0
  403.  
  404.  
  405. testfile:
  406. IF TestArc.rexx(PRAGMA('D')'/'arg)>0 THEN
  407.   DO
  408.     SAY
  409.     SAY pen3'***'def arg pen3'failed archive check!'def
  410.     SAY
  411.     temp=getinput(1 1 'Do you believe the archive checker made a mistake? (Ny) > ')
  412.     IF temp~='Y' THEN
  413.       DO
  414.         CALL DELETE(arg)
  415.         SAY
  416.         RETURN 1
  417.       END
  418.   END
  419. RETURN 0
  420.  
  421.  
  422. editnote:
  423. comment=''
  424. IF ~EXISTS(arg) THEN
  425.   DO
  426.     IF level<sysoplevel THEN RETURN 0
  427.     finfo=STATEF(bbspath'FileNotes/'plaindir'/'arg)
  428.     fromarg=arg
  429.     fromdir=GETCLIP('BBS_frompath')
  430.     IF WORDS(finfo)>7 THEN
  431.       DO
  432.         temp='Y'
  433.         fromdir=WORD(finfo,8)
  434.         fromdir=lastslash(fromdir)
  435.         fromarg=WORD(fromdir,1)
  436.         fromdir=WORD(fromdir,2)
  437.       END
  438.     ELSE temp=getinput(1 1 'Is this file on an another device? (Nqy)')
  439.     IF fromdir='' THEN fromdir='RAM:'
  440.     IF temp='Y' THEN
  441.       DO WHILE comment=''
  442.         comment=GetFile(150,36,fromdir,fromarg,' Select Linked File ')
  443.         IF comment='' THEN RETURN 0
  444.         IF ~EXISTS(comment) THEN comment=''
  445.         ELSE CALL SETCLIP('BBS_frompath',WORD(lastslash(comment),2))
  446.       END
  447.     ELSE IF temp~='N' THEN RETURN 0
  448.   END
  449. filedir=plaindir
  450. CALL MAKEDIR(bbspath'FileNotes/'filedir)
  451. IF ~EXISTS(bbspath'FileNotes/'filedir) THEN
  452.   DO
  453.     SAY pen3'*** Failed to open directory!' filedir||def
  454.     RETURN 0
  455.   END
  456. notename=bbspath'FileNotes/'filedir'/'arg
  457. lynes.=''
  458. filenum=countcheck('Numbers/LastFile' 0)
  459. IF level>sysoplevel THEN firstedit=1
  460. ELSE firstedit=5
  461. IF EXISTS(notename) THEN
  462.   DO
  463.     IF comment~='' THEN ADDRESS COMMAND 'C:filenote' notename comment
  464.     CALL bbsED.rexx(firstedit notename name)
  465.     CALL readlines(notename 1)
  466.     CALL checkfilechanges()
  467.     RETURN 0
  468.   END
  469. IF comment='' THEN filedata=STATEF(libpath||filedir'/'arg)
  470. ELSE filedata=STATEF(comment)
  471. IF filedata='' THEN
  472.   DO
  473.     IF comment='' THEN line=filedir'/'arg
  474.     ELSE line=comment
  475.     SAY line 'does not exist!'
  476.     RETURN 0
  477.   END
  478. bytes=WORD(filedata,2)
  479. filenum=filenum+1
  480. lynes.0=4
  481. lynes.1='File: 'LEFT(filenum,5)' KeyWords:'
  482. lynes.2='Name: 'LEFT(arg,27)' Size: 'bytes' bytes   Downloads: 0'
  483. lynes.3='From: 'LEFT(name,27)' Date: 'DATE() TIME('C')'  Lib: 'filedir
  484. lynes.4=LEFT('',74,'=')
  485. lynes.1=lynes.1 edkeywords(arg filedir)
  486. diz='RAM:file_id.diz'
  487. IF EXISTS(diz) THEN CALL readlines(diz 5)
  488. CALL DELETE(diz)
  489. CALL seelines(1)
  490. edtype=''
  491. CALL writebuffer(scratch'/NoteFile')
  492. IF savelines(notename) THEN RETURN 0
  493. IF comment~='' THEN ADDRESS COMMAND 'C:filenote' notename comment
  494. CALL DELETE(libpath||filedir'/.'STRIP(LEFT(filedir,15)))
  495. fncom='R'
  496. DO WHILE fncom='R'
  497.   CALL seelines(1)
  498.   nonstop=0
  499.   line='['pen3'E'def']dit'
  500.   IF level>sysoplevel THEN line=line '['pen3'K'def']ill'
  501.   line=line '['pen3'R'def']ead ['pen3'S'def']ave'
  502.   IF level>sysoplevel THEN line=line '(ekrS) 'def
  503.   ELSE line=line '(erS) 'def
  504.   fncom=getinput(1 1 line)
  505.   IF fncom='K' & level>sysoplevel THEN
  506.     DO
  507.       SAY 'Killing FileNote..'
  508.       CALL DELETE(notename)
  509.       RETURN 1
  510.     END
  511.   ELSE IF fncom='E' THEN
  512.     DO
  513.       IF bbsED.rexx(firstedit notename name)>0 THEN RETURN 0
  514.       CALL readlines(notename 1)
  515.       CALL checkfilechanges()
  516.       fncom='R'
  517.     END
  518.   ELSE IF fncom~='R' THEN
  519.     DO
  520.       SAY 'Adjusting filelist...'
  521.       IF filenum<1 THEN filenum=1
  522.       IF GETCLIP('BBS_level')~='' THEN CALL SETCLIP('BBS_localfiles',1)
  523.       CALL countcheck('Numbers/LastFile' filenum)
  524.       IF files.0>0 THEN files.filenum=plaindir arg
  525.       IF EXISTS(bbspath'Lists/Files') THEN
  526.         x=OPEN(f,bbspath'Lists/Files','A')
  527.       ELSE x=OPEN(f,bbspath'Lists/Files','W')
  528.       IF x=0 THEN
  529.         DO
  530.           SAY '*** Failed to open' bbspath'Lists/Files'
  531.           RETURN 0
  532.         END
  533.       CALL WRITELN(f,filenum plaindir arg)
  534.       CALL CLOSE(f)
  535.       libnum=finddirnum(plaindir)
  536.       PARSE VAR lynes.1 . 'KeyWords:' keywords
  537.       alpha=LEFT(arg,22-LENGTH(WORD(lynes.2,4)))
  538.       alpha=alpha WORD(lynes.2,4) RIGHT(filenum,5)
  539.       alpha=alpha RIGHT(libnum,2) LEFT(plaindir,12)
  540.       alpha=alpha STRIP(LEFT(STRIP(keywords),32))
  541.       IF SHOW('P','BBBBS') THEN CALL SETCLIP('BBS_localfiles',1)
  542.       IF SHOW('P','BBBBS_LOCAL') THEN CALL SETCLIP('BBS_mainfiles',1)
  543.       newlist.0=newlist.0+1
  544.       nl=newlist.0
  545.       newlist.nl=alpha
  546.       SAY alpha
  547.       tf=bbspath'Lists/Files.ALPHA.add'
  548.       IF EXISTS(tf) THEN ft='A'
  549.       ELSE ft='W'
  550.       x=OPEN(a,tf,ft)
  551.       IF x=0 THEN SAY 'Unable to open File.ALPHA.add for writing!'
  552.       ELSE
  553.         DO
  554.           CALL WRITELN(a,alpha)
  555.           CALL CLOSE(a)
  556.         END
  557.     END
  558. END
  559. RETURN 0
  560.  
  561.  
  562. edkeywords:
  563. PARSE ARG kwarg
  564. templine=''
  565. DO WHILE LENGTH(templine)<3
  566.   SAY
  567.   SAY pen3'Please enter a list of keywords (or a condensed description)'def
  568.   SAY pen3'to be used in the alphabetic list and by the search routine.'def
  569.   SAY '    Note that only the first 32 characters will be used.'
  570.   SAY LEFT('',43)'|'LEFT('',31,'=')'|'
  571.   templine=getinput(0 0 ' 'RIGHT(STRIP(RIGHT(kwarg,32)),32) pen3'KeyWords: 'def)
  572.   templine=cleanstring('0:'templine)
  573.   templine=STRIP(LEFT(templine,32))
  574.   SAY
  575. END
  576. RETURN templine
  577.  
  578.  
  579. savefilelist:
  580. xarg=bbspath'Lists/Files'
  581. CALL DELETE(xarg)
  582. filenum=countcheck('Numbers/LastFile' 0)
  583. IF filenum<1 | files.0<1 THEN RETURN
  584. IF ~writeopen(xarg) THEN RETURN
  585. SAY 'Saving filelist...'
  586. DO i=1 TO filenum
  587.   IF files.i='' THEN ITERATE
  588.   CALL WRITELN(f,i files.i)
  589. END
  590. CALL CLOSE(f)
  591. RETURN
  592.  
  593.  
  594. lastslash:
  595. PARSE ARG sarg 
  596. sdir=''
  597. slash=LASTPOS('/',sarg)
  598. IF slash>2 THEN sdir=LEFT(sarg,slash-1)
  599. ELSE
  600.   DO
  601.     slash=LASTPOS(':',sarg)
  602.     IF slash>0 THEN sdir=LEFT(sarg,slash)
  603.   END
  604. IF slash>0 THEN sarg=SUBSTR(sarg,slash+1)
  605. RETURN sarg sdir
  606.  
  607.  
  608. cleanline:
  609. ARG lflag .
  610. cline=lineup||LEFT(' ',78)
  611. IF lflag=1 THEN cline=cline||lineup
  612. SAY cline
  613. RETURN
  614.  
  615.  
  616. countcheck:
  617. PARSE ARG fname' 'cknum .
  618. fname=bbspath||fname
  619. IF ~EXISTS(fname) THEN
  620.   DO
  621.     IF cknum=0 THEN RETURN 0
  622.     IF ~writeopen(fname) THEN RETURN 0
  623.     CALL WRITELN(f,cknum)
  624.     CALL CLOSE(f)
  625.     RETURN cknum
  626.   END
  627. IF ~readopen(fname) THEN RETURN cknum
  628. retval=STRIP(READLN(f))
  629. CALL CLOSE(f)
  630. IF ~DATATYPE(retval,'W') THEN retval=0
  631. IF ~DATATYPE(cknum,'W') THEN cknum=0
  632. IF retval<cknum THEN
  633.   DO
  634.     IF writeopen(fname) THEN
  635.       DO
  636.         CALL WRITELN(f,cknum)
  637.         CALL CLOSE(f)
  638.         RETURN cknum
  639.       END
  640.   END
  641. RETURN retval
  642.  
  643.  
  644. readopen:
  645. PARSE ARG fname
  646. ok=OPEN(f,fname,'R')
  647. IF ok~=0 THEN RETURN 1
  648. line=fname 'failed to open for reading!'
  649. SAY line
  650. RETURN 0
  651.  
  652.  
  653. writeopen:
  654. PARSE ARG fname
  655. CALL CLOSE(f)
  656. ok=OPEN(f,fname,'W')
  657. IF ok~=0 THEN RETURN 1
  658. line=fname 'failed to open for writing!'
  659. SAY line
  660. RETURN 0
  661.  
  662.  
  663. writebuffer:
  664. PARSE ARG bufname .
  665. CALL DELETE(bufname)
  666. startnum=lynes.0+1
  667. OPTIONS PROMPT ''
  668. SAY pen3'LOCAL logon! Input cannot exceed 250 characters per line!'def
  669. SAY 'Type 'pen3'/E'def 'or' pen3'/S'def' on a new line to exit and' pen3'DO YOUR OWN WORDWRAP!'def
  670. DO bufloop=startnum
  671.   PARSE PULL line
  672.   IF LEFT(UPPER(STRIP(line)),2)='/E' | LEFT(UPPER(STRIP(line)),2)='/S' THEN
  673.     LEAVE bufloop
  674.   lynes.bufloop=line
  675. END
  676. lynes.0=bufloop-1
  677. CALL wrapbuf(startnum)
  678. CALL DELETE(bufname)
  679. CALL savelines(bufname)
  680. CALL readlines(bufname 1)
  681. CALL wrapbuf(startnum)
  682. RETURN
  683.  
  684.  
  685. wrapbuf:
  686. ARG startnum .
  687. SAY pen3'Wordwrapping...'def
  688. lynes.startnum=TRANSLATE(lynes.startnum,' ','09'x)
  689. lynes.startnum=COMPRESS(lynes.startnum,'0C'x)  /* no FF */
  690. DO wi=startnum WHILE wi<=lynes.0
  691.   wj=wi+1
  692.   lynes.wj=COMPRESS(lynes.wj,'08'x||'0C'x||'7F'x)
  693.   tabpos=POS('09'x,lynes.wi)
  694.   DO WHILE tabpos>0
  695.     lynes.wi=DELSTR(lynes.wi,tabpos,1)
  696.     lynes.wi=INSERT('  ',lynes.wi,tabpos-1)
  697.     tabpos=POS('09'x,lynes.wi)
  698.   END
  699.   IF LENGTH(lynes.wi)>75 THEN
  700.     DO
  701.       testchar=''
  702.       IF lynes.wj~='' THEN testchar=LEFT(lynes.wj,1)
  703.       IF testchar=' ' | testchar='.' | testchar=':' THEN
  704.         DO
  705.           DO wjj=lynes.0 TO wi+1 BY -1
  706.             wk=wjj+1
  707.             lynes.wk=lynes.wjj
  708.           END
  709.           lynes.wj=''
  710.           lynes.0=lynes.0+1
  711.         END
  712.       DO wl=WORDS(lynes.wi) TO 1 BY -1 WHILE LENGTH(lynes.wi)>74
  713.         IF WORDS(lynes.wi)=1 THEN
  714.           lynes.wi=LEFT(lynes.wi,74) SUBSTR(lynes.wi,75)
  715.         lynes.wj=WORD(lynes.wi,wl) lynes.wj
  716.         lynes.wi=STRIP(DELWORD(lynes.wi,wl,1))
  717.       END
  718.     END
  719. END
  720. RETURN
  721.  
  722.  
  723. seelines:
  724. DO i=1 TO lynes.0
  725.   SAY lynes.i||def
  726.   IF i//linesperpage=0 THEN
  727.     IF waiting2() THEN LEAVE i
  728. END
  729. nonstop=0
  730. RETURN
  731.  
  732.  
  733. readlines:
  734. CALL CLOSE(f)
  735. PARSE ARG tempname readstart .
  736. IF ~readopen(tempname) THEN RETURN 1
  737. IF readstart<2 THEN lynes.=''
  738. DO ri=readstart
  739.   line=READLN(f)
  740.   IF EOF(f) THEN BREAK
  741.   lynes.ri=line
  742. END
  743. lynes.0=ri-1
  744. CALL CLOSE(f)
  745. DO ri=lynes.0 TO 0 BY -1 WHILE LENGTH(lynes.ri)=0 | LEFT(UPPER(lynes.ri),1)='/'
  746. END
  747. lynes.0=ri
  748. RETURN 0
  749.  
  750.  
  751. savelines:
  752. PARSE ARG tempname .
  753. ok=OPEN(f,tempname,'W')
  754. IF ok=0 THEN
  755.   DO
  756.     SAY '***' tempname 'failed to open for saving!'
  757.     RETURN 1
  758.   END
  759. DO wi=1 TO lynes.0
  760.   CALL WRITELN(f,lynes.wi)
  761. END
  762. CALL CLOSE(f)
  763. RETURN 0
  764.  
  765.  
  766. cleanstring:
  767. PARSE ARG nflag':'cstr
  768. IF nflag=1 THEN
  769.   DO
  770.     cstr=COMPRESS(cstr,"'`")
  771.     cstr=TRANSLATE(cstr,,namemask)
  772.     cstr=SPACE(cstr,1,'_')
  773.     RETURN cstr
  774.   END
  775. bot=XRANGE(,'1F'x)
  776. top=XRANGE('7F'x)
  777. cstr=COMPRESS(cstr,bot||top)
  778. IF nflag=0 THEN cstr=STRIP(cstr)
  779. RETURN cstr
  780.  
  781.  
  782. getinput:
  783. PARSE ARG upflag' 'oneflag' 'pline
  784. OPTIONS PROMPT pline
  785. PARSE PULL inarg
  786. inarg=STRIP(inarg)
  787. IF upflag THEN inarg=UPPER(inarg)
  788. IF oneflag THEN inarg=LEFT(inarg,1)
  789. RETURN inarg
  790.  
  791.  
  792. setdir:
  793. PARSE ARG tempdir
  794. CALL PRAGMA('D',STRIP(tempdir))
  795. plaindir=PRAGMA('D')
  796. slash=LASTPOS('/',plaindir)
  797. IF slash=0 THEN slash=LASTPOS(':',plaindir)
  798. IF slash>0 THEN plaindir=SUBSTR(plaindir,slash+1)
  799. RETURN
  800.  
  801.  
  802. waiting2:
  803. IF nonstop=1 THEN RETURN 0
  804. waitchar=getinput(1 1 pen3'   Q=Quit   N=Non-Stop   RETURN=Continue  'def)
  805. IF waitchar='N' THEN
  806.   DO
  807.     nonstop=1
  808.     SAY pen3'To EXIT non-stop scrolling of text, press CTRL-E        'def
  809.     SAY
  810.     CALL DELAY(100)
  811.     waitchar=''
  812.   END
  813. IF waitchar='Q' THEN RETURN 1
  814. RETURN 0
  815.  
  816.  
  817. showtext:
  818. PARSE ARG arg .
  819. IF EXISTS(arg) THEN
  820.   DO
  821.     CALL readlines(arg 1)
  822.     CALL seelines(1)
  823.     nonstop=0
  824.     CALL waiting()
  825.   END
  826. RETURN
  827.  
  828.  
  829. waiting:
  830. IF waitchar='Q' THEN
  831.   DO
  832.     waitchar=''
  833.     RETURN
  834.   END
  835. waitchar=''
  836. IF nonstop=1 THEN RETURN
  837. OPTIONS PROMPT pen3'                       RETURN=Continue  'def
  838. PULL waitchar
  839. RETURN
  840.  
  841.  
  842. finddirnum:
  843. ARG fdirname .
  844. DO fdir=1 TO 99
  845.   IF UPPER(dirs.fdir)=UPPER(fdirname) THEN RETURN fdir
  846. END
  847. RETURN 100
  848.  
  849.  
  850. chdir:
  851. string=''
  852. SAY pen3||LEFT('-',75,'-')||def
  853. DO i=1 TO libs.0
  854.   SAY libs.i
  855. END
  856. dirnum=getinput(1 0 pen3'Select Library Number: 'def)
  857. IF clr~='' THEN Send clr
  858. IF ~DATATYPE(dirnum,'W') THEN
  859.   DO
  860.     waitchar=dirnum
  861.     RETURN 2
  862.   END
  863.  
  864. chdir2:
  865. IF dirnum<1 | dirnum>99 THEN
  866.   DO
  867.     waitchar=dirnum
  868.     RETURN 1
  869.   END
  870. IF dirs.dirnum='' THEN
  871.   DO
  872.     SAY pen3'That library number is currently un-assigned.'def
  873.     RETURN 1
  874.   END
  875. IF dirnum>level | FIND(data.21,UPPER(dirs.dirnum))>0 THEN
  876.   DO
  877.     SAY pen3'You do not have authorization for that library!'def
  878.     RETURN 1
  879.   END
  880. CALL MAKEDIR(libpath||dirs.dirnum)
  881. CALL setdir(libpath||dirs.dirnum)
  882. t=libpath||plaindir'.txt'
  883. IF ~EXISTS(t) THEN RETURN 0
  884. nonstop=1
  885. SAY
  886. CALL readlines(t 1)
  887. CALL seelines(1)
  888. SAY
  889. nonstop=0
  890. RETURN 0
  891.  
  892.  
  893. fileupdate:
  894. IF savefileflag THEN CALL savefilelist()
  895. CALL checkliblists()
  896. /*
  897. SAY 'DEBUG:'
  898. DO i=1 TO newlist.0
  899.   SAY i newlist.i
  900. END
  901. SAY 'END DEBUG:'
  902. */
  903. IF newlist.0>1 THEN CALL QSort(1,newlist.0,newlist)
  904. IF ~listOPEN(a,bbspath'Lists/Files.ALPHA','R') THEN
  905.   DO
  906.     SAY 'Files.ALPHA failed to open for reading!'
  907.     RETURN
  908.   END
  909. CALL CLOSE(a)
  910. tf=bbspath'Lists/Files.ALPHA.temp'
  911. IF EXISTS(tf) THEN CALL DELETE(tf)
  912. CALL RENAME(bbspath'Lists/Files.ALPHA',tf)
  913. IF ~listOPEN(f,tf,'R') THEN
  914.   DO
  915.     SAY 'Unable to open Files.ALPHA.temp for reading!'
  916.     RETURN
  917.   END
  918. IF ~listOPEN(a,bbspath'Lists/Files.ALPHA','W') THEN
  919.   DO
  920.     SAY 'Unable to open Files.ALPHA for writing!'
  921.     RETURN
  922.   END
  923. nl=1
  924. totfiles=0
  925. SAY 'Writing new alphabetical filelists...'
  926. DO i=1
  927.   line=READLN(f)
  928.   IF EOF(f) THEN LEAVE i
  929.   filenum=WORD(line,3)
  930.   IF files.0>0 THEN
  931.     DO
  932.       IF DATATYPE(filenum,'W') & files.filenum='' THEN
  933.         DO
  934.           SAY 'Deleted:' WORD(line,1)
  935.           ITERATE i
  936.         END
  937.       DO j=1 TO WORDS(numlist)
  938.         IF filenum=WORD(numlist,j) THEN
  939.           DO
  940.             CALL STRIP(DELWORD(numlist,j,1))
  941.             SAY 'Changed:' WORD(line,1)
  942.             ITERATE i
  943.           END
  944.       END
  945.     END
  946.   IF nl<=newlist.0 THEN
  947.     DO WHILE (UPPER(newlist.nl)<UPPER(line)) & (nl<=newlist.0)
  948.       SAY newlist.nl
  949.       CALL WRITELN(a,newlist.nl)
  950.       CALL updateliblists(newlist.nl)
  951.       totfiles=totfiles+1
  952.       nl=nl+1
  953.     END
  954.   CALL WRITELN(a,line)
  955.   CALL updateliblists(line)
  956.   totfiles=totfiles+1
  957. END
  958. totfiles=totfiles+newlist.0-nl-1
  959. DO i=nl TO newlist.0
  960.   CALL WRITELN(a,newlist.i)
  961.   CALL updateliblists(newlist.i)
  962. END
  963. CALL CLOSE(a)
  964. CALL CLOSE(f)
  965. CALL closeliblists()
  966. CALL DELETE(tf)
  967. CALL DELETE(bbspath'Lists/Files.ALPHA.add')
  968. CALL bbsALPHA.rexx(totfiles SUBSTR(extension,2) arccom)
  969. RETURN
  970.  
  971.  
  972. listOPEN:
  973. PARSE ARG fh,listfile,flag
  974. CALL CLOSE(fh)
  975. DO i=0 TO 59 WHILE OPEN(fh,listfile,flag)=0
  976.   IF i//4=0 THEN SAY 'Waiting' (60-i)*5 'more seconds for' listfile 'to become available...'
  977.   CALL DELAY(250)
  978. END
  979. IF i>59 THEN
  980.   DO
  981.     SAY '*** unable to access' listfile 'list.'
  982.     RETURN 0
  983.   END
  984. RETURN 1
  985.  
  986.  
  987. checkliblists:
  988. SAY 'Checking individual library filelists...'
  989. liblist=''
  990. lastlib=0
  991. cnt.=0
  992. dirs.=''
  993. IF ~listOPEN(f,bbspath'Lists/Libraries','R') THEN RETURN
  994. DO i=1
  995.   line=READLN(f)
  996.   IF EOF(f) THEN LEAVE i
  997.   num=WORD(line,1)
  998.   IF ~DATATYPE(num,'W') THEN ITERATE i
  999.   dirs.num=WORD(line,2)
  1000.   finfo=STATEF(libpath||dirs.num'/.'STRIP(LEFT(dirs.num,15)))
  1001.   IF finfo='' THEN liblist=liblist num
  1002. END
  1003. CALL CLOSE(f)
  1004. liblist=STRIP(liblist)
  1005. DO j=1 TO WORDS(liblist)
  1006.   tt=WORD(liblist,j)
  1007.   CALL MAKEDIR(libpath||dirs.tt)
  1008.   lf=libpath||dirs.tt'/.'STRIP(LEFT(dirs.tt,15))
  1009.   flg='W'
  1010.   IF EXISTS(libpath||dirs.tt'.txt') THEN
  1011.     DO
  1012.       ADDRESS COMMAND 'COPY' libpath||dirs.tt'.txt' lf
  1013.       flg='A'
  1014.     END
  1015.   IF ~listOPEN(f,lf,flg) THEN ITERATE j
  1016.   IF flg='A' THEN CALL WRITELN(f,'')
  1017.   CALL WRITELN(f,'Filename          Bytes File# Library         KeyWords')
  1018.   CALL WRITELN(f,LEFT('=',77,'='))
  1019.   CALL CLOSE(f)
  1020. END
  1021. RETURN
  1022.  
  1023.  
  1024. updateliblists:
  1025. PARSE ARG ln 
  1026. x=FIND(liblist,WORD(ln,4))
  1027. IF x=0 THEN RETURN
  1028. tt=WORD(liblist,x)
  1029. IF tt~=lastlib THEN
  1030.   DO
  1031.     CALL CLOSE(b)
  1032.     lastlib=tt
  1033.     x=OPEN(b,libpath||dirs.tt'/.'STRIP(LEFT(dirs.tt,15)),'A')
  1034.     IF x=0 THEN
  1035.       DO
  1036.         lastlib=0
  1037.         RETURN
  1038.       END
  1039.   END
  1040. CALL WRITELN(b,ln)
  1041. cnt.tt=cnt.tt+1
  1042. RETURN
  1043.  
  1044.  
  1045. closeliblists:
  1046. CALL CLOSE(b)
  1047. DO i=1 TO WORDS(liblist)
  1048.   tt=WORD(liblist,i)
  1049.   dname='.'STRIP(LEFT(dirs.tt,15))
  1050.   SAY ' 'dname
  1051.   x=OPEN(f,libpath||dirs.tt'/'dname,'A')
  1052.   IF x~=0 THEN
  1053.     DO
  1054.       CALL WRITELN(f,LEFT('-',77,'-'))
  1055.       temp='file'
  1056.       IF cnt.tt>1 THEN temp=temp's'
  1057.       temp=cnt.tt temp'.  Last updated' DATE() 'at' TIME('C')
  1058.       temp=temp RIGHT(bbsname,76-LENGTH(temp))
  1059.       CALL WRITELN(f,temp)
  1060.       CALL CLOSE(f)
  1061.     END
  1062.   CALL MAKEDIR(bbspath'FileNotes/'dirs.tt)
  1063.   fnote=bbspath'FileNotes/'dirs.tt'/'dname
  1064.   lynes.=''
  1065.   lynes.0=5
  1066.   x=OPEN(f,fnote,'R')
  1067.   IF x~=0 THEN
  1068.     DO
  1069.       DO k=1
  1070.         line=READLN(f)
  1071.         IF EOF(f) THEN LEAVE k
  1072.         lynes.k=line
  1073.       END
  1074.       CALL CLOSE(f)
  1075.       lynes.0=k-1
  1076.     END
  1077.   finfo=STATEF(libpath||dirs.tt'/.'STRIP(LEFT(dirs.tt,15)))
  1078.   bt=WORD(finfo,2)
  1079.   dl=WORD(lynes.2,7)
  1080.   IF ~DATATYPE(dl,'W') THEN dl=0
  1081.   lynes.1='File: 'LEFT(tt,5)' KeyWords: alphabetical files list CONTENTS'
  1082.   lynes.2='Name: 'LEFT(dname,27)' Size:' bt 'bytes  Downloads:' dl
  1083.   lynes.3='From: 'LEFT('BBBBS',27)' Date: 'DATE() TIME('C')'  Lib: 'dirs.tt
  1084.   lynes.4=LEFT('',74,'=')
  1085.   IF lynes.5='' THEN
  1086.     lynes.5='Up to the minute alphabetical filelist of the' dirs.tt 'library.'
  1087.   IF writeopen(fnote) THEN
  1088.     DO
  1089.       DO k=1 TO lynes.0
  1090.         CALL WRITELN(f,lynes.k)
  1091.       END
  1092.       CALL CLOSE(f)
  1093.       SAY LEFT(' ',LENGTH(dname)+2)'1B'x'Mupdated.'
  1094.     END
  1095. END
  1096. RETURN
  1097.  
  1098.  
  1099. browse:
  1100. IF files.0=0 THEN CALL loadfiles()
  1101. arg=''
  1102. curdironly=0
  1103. brdir=PRAGMA('D')
  1104. brfilenum=1
  1105. nonstop=0
  1106. IF files.0<1 THEN RETURN
  1107. lastfile=countcheck('Numbers/LastFile' 0)
  1108. IF lastfile<1 THEN RETURN
  1109. onearg=0
  1110. IF arg='' THEN
  1111.   DO
  1112.     lin='Browsing'
  1113.     test=getinput(1 1 'Browse one library only? (Ny) > ')
  1114.     IF test='Y' THEN
  1115.       DO
  1116.         IF chdir()>0 THEN RETURN
  1117.         curdironly=1
  1118.         lin=lin 'the' pen3||plaindir||def 'library'
  1119.         t=libpath||plaindir'.txt'
  1120.         IF edinfo(t,plaindir,'File Library') THEN RETURN
  1121.       END
  1122.     ELSE lin=lin 'all file libraries'
  1123.     lin=lin 'backwards from latest file.'
  1124.     SAY lin
  1125.     SAY
  1126.   END
  1127. ELSE onearg=1
  1128. i=0
  1129. IF arg='' | UPPER(arg)='NEW' | UPPER(arg)='ALL' THEN
  1130.   DO lastfileloop=1
  1131.     IF lastfile<1 THEN RETURN
  1132.     arg=WORD(files.lastfile,2)
  1133.     brfilenum=lastfile
  1134.     IF WORD(files.lastfile,2)~='' THEN LEAVE lastfileloop
  1135.     lastfile=lastfile-1
  1136.   END
  1137. ELSE IF DATATYPE(arg,'W') THEN
  1138.   DO
  1139.     brfilenum=arg
  1140.     arg=WORD(files.arg,2)
  1141.     IF arg='' THEN
  1142.       DO
  1143.         SAY 'File number' brfilenum 'does not exist in the current libraries!'
  1144.         RETURN
  1145.       END
  1146.   END
  1147. ELSE
  1148.   DO
  1149.     IF onearg THEN CALL busywait(4 1)
  1150.     DO ni=lastfile TO 1 BY -1
  1151.       IF onearg THEN CALL busywait(60 ni lastfile)
  1152.       IF UPPER(WORD(files.ni,2))~=UPPER(arg) THEN ITERATE ni
  1153.       brfilenum=ni
  1154.       CALL busywait(4 0)
  1155.       LEAVE ni
  1156.     END
  1157.     IF ni<1 THEN
  1158.       DO
  1159.         SAY 'Unable to find a file description for' pen3||arg||def'.'
  1160.         RETURN
  1161.       END
  1162.   END
  1163. IF ~curdironly THEN CALL setdir(libpath||WORD(files.brfilenum,1))
  1164. savearg=arg
  1165. IF brfilenum>lastfile THEN brfilenum=lastfile
  1166. newfilesdate=DATE('S') TIME()
  1167. DO browseloop=1
  1168.   IF curdironly THEN CALL busywait(4 1)
  1169.   DO ni=brfilenum TO 0 BY -1
  1170.     IF ni=0 THEN LEAVE browseloop
  1171.     IF files.ni='' THEN ITERATE ni
  1172.     IF onearg THEN
  1173.       DO
  1174.         CALL busywait(60 ni lastfile)
  1175.         IF UPPER(arg)~=UPPER(WORD(files.ni,2)) THEN ITERATE ni
  1176.         IF (ni//30)>0 THEN CALL busywait(4 1)
  1177.         LEAVE ni
  1178.       END
  1179.     testdir=UPPER(WORD(files.ni,1))
  1180.     IF curdironly & UPPER(plaindir)~=UPPER(testdir) THEN
  1181.       DO
  1182.         IF ni>lastbrowse THEN lastbrowse=ni
  1183.         IF ni>0 THEN CALL busywait(60 ni lastfile)
  1184.         ITERATE ni
  1185.       END
  1186.     IF FIND(data.21,testdir)>0 | finddirnum(testdir)>level THEN
  1187.       DO
  1188.         IF ni>lastbrowse THEN lastbrowse=ni
  1189.         ITERATE ni
  1190.       END
  1191.     LEAVE ni
  1192.   END
  1193.   IF curdironly | onearg THEN CALL busywait(4 0)
  1194.   onearg=0
  1195.   IF ni=0 THEN brfilenum=lastbrowse
  1196.   ELSE brfilenum=ni
  1197.   argname=WORD(files.brfilenum,2)
  1198.   IF argname='' THEN RETURN
  1199.   CALL setdir(libpath||WORD(files.brfilenum,1))
  1200.   arg=bbspath'FileNotes/'plaindir'/'argname
  1201.   CALL readlines(arg 1)
  1202.   IF nonstop=1 THEN brostop=1
  1203.   ELSE brostop=0
  1204.   CALL seelines(1)
  1205.   IF brfilenum>lastbrowse THEN lastbrowse=brfilenum
  1206.   IF brostop THEN
  1207.     DO
  1208.       SAY
  1209.       nonstop=1
  1210.       brfilenum=brfilenum-1
  1211.     END
  1212.   ELSE
  1213.     DO
  1214.       line=''
  1215.       endtest=UPPER(RIGHT(argname,4))
  1216.       line=''
  1217.       IF FIND('.ARC .ARJ .DMS .LZH .LHA .RUN .ZIP .ZOO',endtest)>0 THEN
  1218.         line='['pen3'C'def']ontents '
  1219.       line=line'['pen3'D'def']ownload '
  1220.       IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  1221.         line=line'['pen3'E'def']dit'
  1222.       IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  1223.         line=line '['pen3'K'def']ill'
  1224.       IF level>sysoplevel THEN line=line '['pen3'L'def']ib'
  1225.       line=line '['pen3'M'def']ark ['pen3'N'def']on-Stop'
  1226.       IF endtest='.TXT' | UPPER(argname)='.'UPPER(STRIP(LEFT(plaindir,15))) THEN
  1227.         line=line '['pen3'R'def']ead'
  1228.       line=line '['pen3'Q'def']uit ['pen3'?'def'] > '
  1229.       brcom=getinput(1 0 line)
  1230.       IF DATATYPE(brcom,'W') THEN
  1231.         DO
  1232.           brfilenum=brcom+1
  1233.           IF brfilenum>lastfile THEN brfilenum=lastfile+1
  1234.           IF brfilenum<1 THEN brfilenum=1
  1235.           SAY
  1236.         END
  1237.       ELSE brcom=LEFT(brcom,1)
  1238.       CALL cleanline(0)
  1239.       IF brcom='Q' THEN LEAVE browseloop
  1240.       IF brcom='M' THEN
  1241.         DO
  1242.           wordnum=FIND(dlist,brfilenum)
  1243.           IF wordnum=0 THEN
  1244.             DO
  1245.               dlist=STRIP(dlist brfilenum)
  1246.               SAY lineup||argname 'marked to copy later.'
  1247.               SAY
  1248.             END
  1249.           ELSE
  1250.             DO
  1251.               dlist=STRIP(DELWORD(dlist,wordnum,1))
  1252.               SAY argname 'removed from copy list.'
  1253.             END
  1254.         END
  1255.       IF brcom='H' | brcom='?' THEN
  1256.         DO
  1257.           SAY pen3' - HELP with the Browse Files commands -'def
  1258.           SAY ' RETURN reads the next file description in line.'
  1259.           SAY ' 34 will display the description of file number 34, if it exists.'
  1260.           SAY ' C  displays the contents of an archived (arc dms lzh lha zip zoo) file.'
  1261.           SAY ' D  displays the download menu.'
  1262.           IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  1263.             DO
  1264.           SAY ' E  puts this file description into the online Editor.'
  1265.           SAY ' K  deletes a file you uploaded. you cannot Kill others!'
  1266.             END
  1267.           IF level>sysoplevel THEN
  1268.           SAY ' L  move file and description to new Library and/or rename.'
  1269.           SAY ' M  mark/unmark the current file for the next download'
  1270.           SAY ' N  displays all descriptions without pausing. CTRL-E to Exit!'
  1271.           SAY ' R  displays file as text. - ONLY FILES THAT END IN .TXT -'
  1272.           SAY ' Q  returns to the main menu(s). (Quit)'
  1273.           SAY
  1274.           CALL waiting()
  1275.           IF waitchar='Q' THEN LEAVE browseloop
  1276.         END
  1277.       ELSE IF brcom='L' & level>sysoplevel THEN
  1278.         DO
  1279.           curdir=PRAGMA('D')
  1280.           IF getinput(1 1 'Rename' argname '? (Ny) > ')='Y' THEN
  1281.             DO
  1282.               newarg=getinput(0 0 'Rename' argname 'to ')
  1283.               IF newarg~='' THEN
  1284.                 DO
  1285.                   IF is_here(newarg) THEN ITERATE browseloop
  1286.                   IF wi=999999 THEN ITERATE browseloop
  1287.                   IF EXISTS(libpath||filedir'/'newarg) THEN
  1288.                     DO
  1289.                       SAY
  1290.                       SAY '***' newarg 'already exists!'
  1291.                       SAY
  1292.                       ITERATE browseloop
  1293.                     END
  1294.                   junk=getinput(1 1 'Are you SURE you want to rename' argname 'to' newarg'? (Ny) ')
  1295.                   IF junk='Y' THEN
  1296.                     DO
  1297.                       lynes.2=OVERLAY(newarg,lynes.2,7,25)
  1298.                       comment=WORD(STATEF(arg),8)
  1299.                       CALL DELETE(arg)
  1300.                       arg=bbspath'FileNotes/'plaindir'/'newarg
  1301.                       CALL savelines(arg)
  1302.                       IF comment='' THEN
  1303.                         DO
  1304.                           mpath=libpath||plaindir
  1305.                           IF RENAME(mpath'/'argname,mpath'/'newarg)=0 THEN
  1306.                             SAY 'Rename failed on main file!'
  1307.                         END
  1308.                       ELSE
  1309.                         DO
  1310.                           t=LASTPOS('/',comment)
  1311.                           IF t=0 THEN t=LASTPOS(':',comment)
  1312.                           mpath=LEFT(comment,t-1)
  1313.                           IF RENAME(comment,mpath'/'newarg)=1 THEN
  1314.                             ADDRESS COMMAND 'C:FileNote' arg mpath'/'newarg
  1315.                           ELSE SAY 'Rename failed on external file!'
  1316.                         END
  1317.                       files.brfilenum=STRIP(WORD(files.brfilenum,1)) newarg
  1318.                       keywords=STRIP(SUBSTR(lynes.1,23))
  1319.                       CALL addfile()
  1320.                       argname=newarg
  1321.                       savefileflag=1
  1322.                       CALL DELETE(libpath||plaindir'/.'STRIP(LEFT(plaindir,15)))
  1323.                     END
  1324.                 END
  1325.             END
  1326.           IF getinput(1 1 'Move' argname '? (Ny) > ')='Y' THEN
  1327.             DO
  1328.               IF chdir()=0 THEN
  1329.                 DO
  1330.                   IF UPPER(dirs.dirnum)~=UPPER(WORD(files.brfilenum,1)) THEN
  1331.                     DO
  1332.                       CALL readlines(arg 1)
  1333.                       CALL movefile(brfilenum dirs.dirnum)
  1334.                     END
  1335.                 END
  1336.             END
  1337.           CALL setdir(curdir)
  1338.         END
  1339.       ELSE IF brcom='N' THEN
  1340.         DO
  1341.           brfilenum=brfilenum-1
  1342.           nonstop=1
  1343.           SAY pen3'To EXIT non-stop scrolling of text, press CTRL-E'def
  1344.           SAY
  1345.           CALL DELAY(99)
  1346.           brcom=''
  1347.         END
  1348.       ELSE IF brcom='C' THEN
  1349.         DO
  1350.           temp=STRIP(WORD(STATEF(arg),8))
  1351.           IF temp='' THEN temp=libpath||plaindir'/'argname
  1352.           CALL Contents.rexx(temp)
  1353.           IF EXISTS('RAM:CONTENTS') THEN
  1354.             DO
  1355.               CALL cleanline(1)
  1356.               CALL readlines('RAM:CONTENTS' 1)
  1357.               CALL seelines(0)
  1358.               IF waitchar~='Q' THEN CALL waiting()
  1359.               nonstop=0
  1360.             END
  1361.           ELSE SAY pen3'Not an archived file.'def
  1362.         END
  1363.       ELSE IF brcom='D' THEN
  1364.         DO
  1365.           IF pickdir() THEN CALL copyfile(brfilenum)
  1366.         END
  1367.       ELSE IF brcom='E' THEN
  1368.         DO
  1369.           IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  1370.             DO
  1371.               firstedit=5
  1372.               IF level>sysoplevel THEN firstedit=1
  1373.               CALL bbsEd.rexx(firstedit arg name)
  1374.               CALL readlines(arg 1)
  1375.               CALL checkfilechanges()
  1376.             END
  1377.         END
  1378.       ELSE IF brcom='K' THEN
  1379.         DO
  1380.           IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  1381.             DO
  1382.               IF getinput(1 1 pen3'Do you really want to kill this file? (nY) >'def)~='N' THEN
  1383.                 DO
  1384.                   tempnum=WORD(lynes.1,2)
  1385.                   IF tempnum=lastfile THEN
  1386.                     DO
  1387.                       CALL DELETE(bbspath'Numbers/LastFile')
  1388.                       CALL DELAY(28)
  1389.                       lastfile=lastfile-1
  1390.                       CALL countcheck('Numbers/LastFile' lastfile)
  1391.                     END
  1392.                   files.tempnum=''
  1393.                   savefileflag=1
  1394.                   finfo=STATEF(arg)
  1395.                   IF WORDS(finfo)>7 THEN argname=WORD(finfo,8)
  1396.                   CALL DELETE(argname)
  1397.                   CALL DELETE(arg)
  1398.                   SAY argname pen3'has been deleted.'def
  1399.                   CALL DELETE(libpath||plaindir'/.'STRIP(LEFT(plaindir,15)))
  1400.                 END
  1401.             END
  1402.         END
  1403.       ELSE IF brcom='R' & (endtest='.TXT' | UPPER(argname)='.'UPPER(STRIP(LEFT(plaindir,15)))) THEN
  1404.         DO
  1405.           vcount=WORD(lynes.2,7)+1
  1406.           lynes.2=STRIP(DELWORD(lynes.2,7,1)) vcount
  1407.           edtype=''
  1408.           CALL savelines(arg)
  1409.           CALL showtext(argname)
  1410.         END
  1411.       ELSE brfilenum=brfilenum-1
  1412.     END
  1413. END
  1414. CALL setdir(brdir)
  1415. waitchar=''
  1416. IF nonstop THEN CALL waiting()
  1417. nonstop=0
  1418. CALL savedata(0)
  1419. RETURN
  1420.  
  1421.  
  1422. pickdir:
  1423. topath=GETCLIP('BBS_topath')
  1424. IF topath='' THEN topath=GETCLIP('BBS_frompath')
  1425. todir=GetFile(150,36,topath,'',' Destination ',,'NOFILES')
  1426. IF RIGHT(todir,1)='/' THEN todir=LEFT(todir,LENGTH(todir)-1)
  1427. IF WORD(STATEF(todir),1)='DIR' THEN
  1428.   DO
  1429.     IF todir~=topath THEN CALL SETCLIP('BBS_topath',todir)
  1430.     RETURN 1
  1431.   END
  1432. ELSE SAY pen3'*'def||todir||pen3'* is not a valid directory!'def
  1433. RETURN 0
  1434.  
  1435.  
  1436. copyfile:
  1437. ARG fnum .
  1438. copyarg=libpath||SPACE(files.fnum,1,'/')
  1439. fname=WORD(files.num,2)
  1440. finfo=STATEF(arg)
  1441. IF WORDS(finfo)>7 THEN copyarg=WORD(finfo,8)
  1442. SAY 'Copying' fname 'to' todir'...'
  1443. ADDRESS COMMAND 'COPY' copyarg todir 'CLONE'
  1444. RETURN
  1445.  
  1446.  
  1447. movefile:
  1448. PARSE ARG fnum movdir .
  1449. savefileflag=1
  1450. fromdir=STRIP(WORD(files.fnum,1))
  1451. farg=STRIP(WORD(files.fnum,2))
  1452. md=libpath||movdir
  1453. mf=md'/'farg
  1454. fd=libpath||fromdir
  1455. ff=fd'/'farg
  1456. CALL DELETE(md'/.'STRIP(LEFT(movdir,15)))
  1457. CALL DELETE(fd'/.'STRIP(LEFT(fromdir,15)))
  1458. fn=bbspath'FileNotes/'fromdir'/'farg
  1459. commen=WORD(STATEF(fn),8)
  1460. IF commen~='' THEN
  1461.   DO
  1462.     ff=commen
  1463.     n=LASTPOS('/',ff)
  1464.     IF n>1 THEN
  1465.       DO
  1466.         xf=SUBSTR(ff,n+1)
  1467.         tfd=LEFT(ff,n-1)
  1468.         n=LASTPOS('/',tfd)
  1469.         IF n=0 THEN n=LASTPOS(':',tfd)
  1470.         IF n>0 THEN
  1471.           DO
  1472.             tmd=LEFT(tfd,n)||movdir
  1473.             SAY 'Rename external file'pen3 ff||def
  1474.             IF getinput(1 1 '                  to'pen3 tmd'/'farg||def'? (Ny) > ')='Y' THEN
  1475.               DO
  1476.                 fd=tfd
  1477.                 md=tmd
  1478.                 mf=md'/'farg
  1479.                 commen=md'/'xf
  1480.               END
  1481.             ELSE IF getinput(1 1 '          or move to'pen3 mf||def'? (Ny) > ')='Y' THEN
  1482.               DO
  1483.                 fd=tfd
  1484.                 commen=''
  1485.               END
  1486.           END
  1487.       END
  1488.   END
  1489. CALL MAKEDIR(md)
  1490. IF RENAME(ff,mf)=0 THEN
  1491.   DO
  1492.     ADDRESS COMMAND 'C:COPY' ff mf
  1493.     IF EXISTS(mf) THEN
  1494.       IF DELETE(ff)~=1 THEN SAY pen3'Unable to delete'def ff||pen3'.'def
  1495.   END
  1496. files.fnum=movdir farg
  1497. lynes.3=DELWORD(lynes.3,WORDS(lynes.3),1)
  1498. lynes.3=STRIP(lynes.3) movdir
  1499. CALL MAKEDIR(bbspath'FileNotes/'movdir)
  1500. mn=bbspath'FileNotes/'movdir'/'farg
  1501. CALL savelines(mn)
  1502. IF EXISTS(mn) THEN
  1503.   DO
  1504.     CALL DELETE(fn)
  1505.     comm='C:FileNote' mn
  1506.     IF commen~='' THEN comm=comm commen
  1507.     ADDRESS COMMAND comm
  1508.   END
  1509. keywords=STRIP(SUBSTR(lynes.1,23))
  1510. CALL addfile()
  1511. SAY 'Moved:' fromdir'/'farg 'to' movdir
  1512. RETURN
  1513.  
  1514.  
  1515. savedata:
  1516. SAY 'Updating...             'lineup
  1517. IF lastbrowse~=WORD(data.16,1) THEN data.16=lastbrowse DATE('S') TIME()
  1518. IF ~writeopen(bbspath'USERS/'name) THEN RETURN
  1519. IF data.0<27 THEN data.0=27
  1520. DO i=1 TO data.0
  1521.   CALL WRITELN(f,data.i)
  1522. END
  1523. CALL CLOSE(f)
  1524. SAY 'User' name 'has been updated.'
  1525. RETURN
  1526.  
  1527.  
  1528. loaddata:
  1529. IF name='' THEN RETURN 0
  1530. IF ~readopen(bbspath'USERS/'name) THEN RETURN 0
  1531. data.=''
  1532. DO i=1
  1533.   line=READLN(f)
  1534.   IF EOF(f) THEN BREAK
  1535.   data.i=line
  1536. END
  1537. data.0=i-1
  1538. CALL CLOSE(f)
  1539. lastbrowse=WORD(data.16,1)
  1540. IF ~DATATYPE(lastbrowse,'W') THEN lastbrowse=0
  1541. level=data.20
  1542. password=data.5
  1543. linesperpage=20
  1544. colorflag=1
  1545. IF FIND(UPPER(data.8),'CLEAR')>0 THEN clr='0C'x
  1546. ELSE clr=''
  1547. RETURN 1
  1548.  
  1549.  
  1550. loadfiles:
  1551. SAY def
  1552. IF ~listOPEN(f,bbspath'Lists/Files','R') THEN RETURN
  1553. SAY 'Loading filelist...'
  1554. files.=''
  1555. files.0=0
  1556. DO i=1
  1557.   line=READLN(f)
  1558.   IF EOF(f) THEN BREAK
  1559.   num=WORD(line,1)
  1560.   IF DATATYPE(num,'W') THEN files.num=WORD(line,2) WORD(line,3)
  1561. END
  1562. files.0=i-1
  1563. CALL CLOSE(f)
  1564. RETURN
  1565.  
  1566.  
  1567. checkfilechanges:
  1568. t=GETCLIP('BBS_FileChangeLOCAL')
  1569. IF t='' THEN RETURN
  1570. CALL SETCLIP('BBS_FileChangeLOCAL')
  1571. tn=WORDS(t)
  1572. IF tn>1 THEN
  1573.   DO
  1574.     fnum=WORD(t,tn)%1
  1575.     t=STRIP(DELWORD(t,tn,1))
  1576.     CALL SETCLIP('BBS_FileChangeLOCAL',t)
  1577.   END
  1578. ELSE fnum=t%1
  1579. keywords=GETCLIP('BBS_Keywords_'fnum)
  1580. CALL SETCLIP('BBS_Keywords_'fnum)
  1581. CALL addfile()
  1582. RETURN
  1583.  
  1584.  
  1585. addfile:
  1586. filenum=WORD(lynes.1,2)
  1587. num=0
  1588. DO ii=1 TO newlist.0
  1589.   IF WORD(newlist.ii,3)=filenum THEN num=ii
  1590. END
  1591. IF num=0 THEN
  1592.   DO
  1593.     num=newlist.0+1
  1594.     newlist.0=num
  1595.   END
  1596. libnum=finddirnum(WORD(lynes.3,9))
  1597. newlist.num=LEFT(WORD(lynes.2,2),22-LENGTH(WORD(lynes.2,4)))
  1598. newlist.num=newlist.num WORD(lynes.2,4) RIGHT(filenum,5)
  1599. newlist.num=newlist.num RIGHT(libnum,2) LEFT(WORD(files.filenum,1),12)
  1600. newlist.num=newlist.num STRIP(LEFT(keywords,32))
  1601. IF FIND(numlist,filenum)=0 THEN numlist=filenum numlist
  1602. RETURN
  1603.  
  1604.  
  1605. edinfo:
  1606. PARSE ARG t1,t2,t3
  1607. IF level<sysoplevel THEN RETURN 0
  1608. IF getinput(1 1 'Edit the'pen3 t2 def||t3 'info file? (Ny) > ')='Y' THEN
  1609.   DO
  1610.     IF ~EXISTS(t) THEN
  1611.       DO
  1612.         IF writeopen(t1) THEN
  1613.           DO
  1614.             CALL WRITELN(f,TRIM(CENTER('***'pen3 t2 def||t3 '***',75)))
  1615.             CALL WRITELN(f,LEFT('',75,'='))
  1616.             CALL CLOSE(f)
  1617.             CALL DELAY(28)
  1618.           END
  1619.       END
  1620.     CALL bbsEd.rexx(1 t1 name)
  1621.     RETURN 1
  1622.   END
  1623. RETURN 0
  1624.  
  1625.  
  1626. busywait:
  1627. ARG bii bi bt 
  1628. IF bi<1 THEN
  1629.   DO
  1630.     CALL WRITECH(STDOUT,'080808'x)
  1631.     IF ni<1 & i>999998 & wi>999998 THEN SAY
  1632.     RETURN
  1633.   END
  1634. IF bi=1 THEN CALL WRITECH(STDOUT,'   ')
  1635. IF bi//(bii%2)~=0 THEN RETURN
  1636. b=bi//bii
  1637. IF b=0 | b=bii%2 THEN
  1638.   DO
  1639.     tp=RIGHT((bi*100)%bt,2)'%'
  1640.     CALL WRITECH(STDOUT,'080808'x||tp)
  1641.   END
  1642. RETURN
  1643.  
  1644.  
  1645. BREAK_E:
  1646. i=999999
  1647. ri=999999
  1648. wi=999999
  1649. RETURN
  1650.  
  1651.  
  1652. BREAK_C:
  1653. EXIT
  1654.  
  1655. /* bbsFile.rexx */
  1656.